ac9fc60758e6709a0b791b554bcbde94c48424e3,trunk/JLanguageTool/src/java/de/danielnaber/languagetool/rules/patterns/PatternRule.java,PatternRule,match,#AnalyzedSentence#,296

Before Change


              exceptionMatched = true;
              prevMatched = true;
            }
            if (elem.isReferenceElement()
                && (firstMatchToken + elem.getMatch().getTokenRef() < tokens.length)) {
              elem.compile(tokens[firstMatchToken
                                  + elem.getMatch().getTokenRef()], language.getSynthesizer());
            }
            if (elem.hasAndGroup()) {
              for (final Element andElement : elem.getAndGroup()) {
                if (andElement.isReferenceElement()
                    && (firstMatchToken + andElement.getMatch().getTokenRef() < tokens.length)) {
                  andElement.compile(tokens[firstMatchToken
                                            + andElement.getMatch().getTokenRef()], language
                                            .getSynthesizer());
                }
              }

After Change


  public final RuleMatch[] match(final AnalyzedSentence text)
      throws IOException {
    final List<RuleMatch> ruleMatches = new ArrayList<RuleMatch>();
    final AnalyzedTokenReadings[] tokens = text.getTokensWithoutWhitespace();
    final int[] tokenPositions = new int[tokens.length + 1];
    int tokenPos = 0;
    int prevSkipNext = 0;
    int skipNext = 0;
    int matchPos = 0;
    int skipShift = 0;
    // this variable keeps the total number
    // of tokens skipped - used to avoid
    // that nextPos gets back to unmatched tokens...
    int skipShiftTotal = 0;
    int firstMatchToken = -1;
    int lastMatchToken = -1;
    final int patternSize = patternElements.size();
    Element elem = null, prevElement = null;
    final boolean sentStart = patternElements.get(0).isSentStart();
    language.getUnifier().reset();
    boolean inUnification = false;
    boolean uniMatched = false;

    for (int i = 0; i < tokens.length; i++) {
      boolean allElementsMatch = true;
      // stop processing if rule is longer than the sentence
      // or stop looking for sent_start - it will never match any token except
      // the first
      if (patternSize + i > tokens.length || sentStart && i > 0) {
        allElementsMatch = false;
        break;
      }
      int matchingTokens = 0;
      for (int k = 0; (k < patternSize); k++) {
        if (elem != null) {
          prevElement = elem;
        }
        elem = patternElements.get(k);
        skipNext = translateElementNo(elem.getSkipNext());
        final int nextPos = tokenPos + k + skipShiftTotal;
        if (nextPos >= tokens.length) {
          allElementsMatch = false;
          break;
        }
        boolean skipMatch = false, thisMatched = false, prevMatched = false;
        boolean exceptionMatched = false;
        if (prevSkipNext + nextPos >= tokens.length || prevSkipNext < 0) { // SENT_END?
          prevSkipNext = tokens.length - (nextPos + 1);
        }
        for (int m = nextPos; m <= nextPos + prevSkipNext; m++) {
          boolean matched = false;
          final int numberOfReadings = tokens[m].getReadingsLength();
          for (int l = 0; l < numberOfReadings; l++) {
            final boolean lastReading = l + 1 == numberOfReadings;
            final AnalyzedToken matchToken = tokens[m].getAnalyzedToken(l);
            if (prevSkipNext > 0 && prevElement != null
                && prevElement.isMatchedByScopeNextException(matchToken)) {
              exceptionMatched = true;
              prevMatched = true;
            }
            if (elem.isReferenceElement()) {
              setupRef(firstMatchToken, elem, tokens);
            }
            if (elem.hasAndGroup()) {
              for (final Element andElement : elem.getAndGroup()) {